package com.taotao.job.rpc.core.proxy;

import com.taotao.job.rpc.core.invoker.Invoker;
import com.taotao.job.rpc.core.invoker.InvokerMeta;
import com.taotao.job.rpc.core.meta.IfaceMeta;
import net.sf.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * @author fanbeibei
 * @date 2020/10/31 0:30
 */
public class CglibRpcProxyFactory extends AbstractRpcProxyFactory {

    @Override
    public <T> T newProxyInstance0(Class<T> ifaceClass, Invoker invoker) {
        Enhancer enhancer = new Enhancer();
        enhancer.setInterfaces(new Class[]{ifaceClass});

        enhancer.setCallbacks(new Callback[]{
                new MethodInterceptor() {
                    @Override
                    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

                        // 这里不调用 proxy.invokeSuper(obj, args);直接写方法的代码，相当于实现接口
                        return invoker.invokeMethod(new InvokerMeta(new IfaceMeta(ifaceClass.getName(), method.getName()), args), method.getReturnType());
                    }
                }
        });


        return (T) enhancer.create();
    }
}
